/*高等数学:习题1-1 第1题 核心算法*/
function hm_test_1_1_1_core(){

	// =====================  开始:通用类的定义 ==========================
	
	/**
	 * 区间类
	 * 
	 * 构造函数:用于表示最简形式的不含任何交并运算的数学意义上的区间
	 * 
	 * @param	leftEndPoint	区间的左端点,可以是数字或者null,默认为null,
	 * 							null表示负无穷大.非数字类型数字将会统一按null
	 * 							处理
	 * @param	rigthEndPoint	区间的右端点,可以是数字或者nulll,默认为null,
	 * 							null表示正无穷大.非数字类型数字将会统一按null
	 * 							处理
	 * @param	isLeftEndOpen	是否是左开区间,是否是左开区间,默认均为true,即
	 * 							默认为开区间.若设置闭区间,请显式传递布尔值false
	 * @param	isRightOpen		是否是右开区间,是否是右开区间,默认均为true,即
	 * 							默认为开区间.若设置闭区间,请显式传递布尔值false
	 * 
	 * 注意:若leftEndPoint为null,则isLeftOpen必然是true,此时传入的isLeftOpen
	 * 		的参数值被忽略;若rightEndPoint为null,则isRightOpen也必然是true,
	 * 		此时传入的isRightOpen参数值被忽略!
	 */ 
	function Interval(isLeftOpen,leftEndPoint, rightEndPoint, isRightOpen){
		if(typeof leftEndPoint !== 'number'){
			this.leftEndPoint = null;
		}else{
			this.leftEndPoint = leftEndPoint;
		}
		
		if(typeof rightEndPoint !== 'number'){
			this.rightEndPoint = null;
		}else{
			this.rightEndPoint = rightEndPoint;
		}
		
		
		if(isLeftOpen === false && this.leftEndPoint !== null){
			this.isLeftOpen = false;
		}else{
			this.isLeftOpen = true;
		}
		
		if(isRightOpen === false && this.rightEndPoint !== null){
			this.isRightOpen = false;
		}else{
			this.isRightOpen = true;
		}
		
	}
	
	// -----------------------------------------------------------------
	
	/**
	 * toString()方法
	 * 
	 * @return	区间类对象的字符串表示.
	 * 将对象转换为字符串输出
	 */ 
	 Interval.prototype.toString = function(){
		 if(this.isLeftOpen){
			var leftBracket = '(';
		 }else{
			var leftBracket = '[';
		 }
		 
		 if(this.leftEndPoint === null){
			var leftEndPoint = '-∞';
		 }else{
			 var leftEndPoint = this.leftEndPoint;
		 }
		 
		 if(this.rightEndPoint === null){
			 var rightEndPoint = '+∞'
		 }else{
			 var rightEndPoint = this.rightEndPoint;
		 }
		 
		 if(this.isRightOpen){
			 var rightBracket = ')';
		 }else{
			 var rightBracket = ']';
		 }
		 
		 var intervalString = leftBracket+leftEndPoint+','+rightEndPoint+rightBracket;
		 return intervalString;
	 };
	 
	// -----------------------------------------------------------------
	
	/**
	 * 集合的并运算
	 * 
	 * @param	interval	与此集合对象进行集合并运算.
	 * 
	 * @return	返回一个Interval对象.当结果中必须含有集合运算符时,将返回一个含有
	 * 			三个元素的数组作为返回值,数组的三个元素依次为 intervalA,operator,
	 * 			intervalB,其中intervalA,intervalB表示无法进一步合并的集合.
	 * 
	 */
	Interval.prototype.union = function(interval){
		//分多种情况讨论
		if((this.leftEndPoint === null && this.rightEndPoint === null) ||
			(interval.leftEndPoint === null && interval.rightEndPoint === null)){
			//情况一:两个集合中至少有一个有一个是全体实数集合R,即(-∞,+∞).
				var rtn = new Interval(true, null, null, true);
		}else if(this.leftEndPoint === null && interval.leftEndPoint === null){
			//情况二:两个集合均为从负无穷开始的无限区间
			if(this.rightEndPoint < interval.rightEndPoint){
				var rtn = new Interval(true, null, interval.rightEndPoint, interval.isRightOpen);
			}else if(interval.rightEndPoint < this.rightEndPoint){
				var rtn = new Interval(true, null, this.rightEndPoint, this.isRightOpen);
			}else{
				var rtn = new Interval(true, null, this.rightEndPoint, this.isRightOpen && interval.isRightOpen);
			}
		}else if(this.rightEndPoint === null && interval.rightEndPoint === null){
			// 情况三:两个集合均为趋向于正无穷的无限区间
			if(this.leftEndPoint < interval.leftEndPoint){
				var rtn = new Interval(this.isLeftOpen, this.leftEndPoint, null, true);
			}else if(interval.leftEndPoint > this.leftEndPoint){
				var rtn = new Interval(interval.isLeftOpen, interval.leftEndPoint, null, true);
			}else{
				var rtn = new Interval(this.isLeftOpen && this.isLeftOpen, this.leftEndPoint, null, true);
			}
		}else if(this.leftEndPoint === null && interval.rightEndPoint === null){
			// 情况四:this从负无穷开始,interval趋向于正无穷
			if(this.rightEndPoint < interval.leftEndPoint){
				var intervalA = new Interval(this.isLeftOpen, this.leftEndPoint, this.rightEndPoint, this.isRightOpen);
				var intervalB = new Interval(interval.isLeftOpen, interval.leftEndPoint, interval.rightEndPoint, interval.isRightOpen);
				var rtn = new Array(intervalA, 'union', intervalB);
			}else if(interval.leftEndPoint < this.rightEndPoint){
				var rtn = new Interval(true, null, null, true);
			}else{
				//if(this.)
				this的左顶点或interval的右顶点,是否相等,两种情况,两个值!
				尝试根据四个顶点的相对位置,去讨论分类;
				构造函数中,应该约束,左顶点必须小于右右顶点
			}
		}
		
		
		return rtn;
		
	};
	
	
	 //区间类结束
	 
	 // ====================== 结束:通用类的定义 ==============================
	 
	 //======================= 开始:答题 ================================
	 
	 /**
	  * 题目:《高等数学第六版》（上册） 习题 1-1	第1题
	  * 
	  * 设 A = ( - ∞, - 5 ) ∪ ( 5, + ∞ ), B= [ - 10, 3 ),写出A ∪ B, 
	  * A ∩ B,A \ B,及A \ ( A \ B )的表达式.
	  *
	  */ 
	 var a = new Interval(false, null, 3, false);
	 var b = new Interval(true, 1, null, true);
	 alert(a.union(b));

}
hm_test_1_1_1_core();









